package system

import (
	"database/sql/driver"
	"encoding/json"

	"gorm.io/gorm"
)

type Menu struct {
	gorm.Model
	Name     *string `gorm:"type:varchar(50);comment:'菜单名称(英文名, 可用于国际化)'" json:"name,omitempty"`
	Path     string  `gorm:"type:varchar(100);comment:'菜单访问路径'" json:"path"`
	Redirect *string `gorm:"type:varchar(100);comment:'重定向路径'" json:"redirect,omitempty"`
	Meta     Meta    `gorm:"json" json:"meta"`
	Status   *uint    `gorm:"type:uint;default:1;comment:'菜单状态(1正常/0禁用, 默认正常)'" json:"status"`
	ParentId *uint   `gorm:"type:uint;default:0;comment:'父菜单编号(编号为0时表示根菜单)'" json:"parentId"`
	Creator  string  `gorm:"type:varchar(20);comment:'创建人'" json:"creator"`
	Children []*Menu `gorm:"-" json:"children,omitempty"`                  // 子菜单集合
	Roles    []*Role `gorm:"many2many:role_menus;" json:"roles,omitempty"` // 角色菜单多对多关系
	Type     uint    `gorm:"type:uint;default:1;comment:'1一级菜单/2二级菜单/3三级菜单'" json:"type"`
}

type Meta struct {
	Title      string   `gorm:"type:varchar(100);" json:"title"`
	Icon       *string  `gorm:"type:varchar(100);" json:"icon,omitempty"`
	Rank       uint     `gorm:"type:int(3) unsigned;default:999;comment:'菜单顺序(1-999)'" json:"rank"`
	Roles      []string `gorm:"json" json:"roles,omitempty"`
	ShowLink   *bool     `gorm:"type:bool; default:true; comment:'菜单在侧边栏隐藏'" json:"showLink,omitempty"`
	KeepAlive  *bool     `gorm:"type:bool; default:true; comment:'菜单是否被 <keep-alive> 缓存'" json:"keepAlive,omitempty"`
	ShowParent *bool     `gorm:"type:bool; default:true; comment:'忽略之前定义的规则，一直显示根路由'" json:"showParent,omitempty"`
	HiddenTag  *bool     `gorm:"type:bool; default:false; comment:'标签页可见性(可见/隐藏, 默认false可见)'" json:"hiddenTag,omitempty"`
}

// Scan 解码json字符串
func (m *Meta) Scan(val interface{}) error {
	b, _ := val.([]byte)
	return json.Unmarshal(b, m)
}

// Value 编码json
func (m Meta) Value() (value driver.Value, err error) {
	return json.Marshal(m)
}
